package com.cskaoyan.javase.basic._2variable._4detail;

/**
 * 表达式类型提升
 * 如果表达式当中存在多种数据类型 变量 参与运算，由于表达式的运算结果是唯一的，所以结果变量的数据类型将会提升到"最大取值范围"的那个。有以下规则：
 *
 * byte、short、char之间不互相转换，一旦发生运算，一律自动转换为int进行运算，结果是int
 * byte、short、char任何数据类型与int进行计算，一律自动转换为int进行计算，结果是int
 * byte、short、char、int任何数据类型与long进行计算，一律自动转换为long进行计算，结果是long
 * byte、short、char、int、long任何数据类型与float进行计算，一律自动转换为float进行计算，结果是float
 * byte、short、char、int、long、float任何数据类型与double进行计算，一律自动转换为double进行计算，结果是double
 * 注：char类型比较特殊，在参与数值类型的计算时，是编码值参与了运算。比如：
 *
 * char c = 'a';
 * 如果上述变量c参与数值运算，那么就是编码值97参与运算！
 *
 * 特殊的：
 * String作为字符串类型，也可以使用" + "在表达式中参与运算，称之为"字符串的拼接"。 任何表达式一旦有字符串拼接运算，那么结果必然是String类型。
 *
 *
 * 最重要的一点:
 * 只要表达式中存在任一变量，那么表达式的最终结果数据类型就遵循"表达式的类型提升"。
 * 反之,如果表达式中全部都是常量参与运算,结果就不一定了
 *
 * @since 17:27
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo3 {
    public static void main(String[] args) {
        int a = 10;
        double b = 0.1;
        // 表达式的结果数据类型会自动提升到表达式中取值范围最大的那个数据类型
        double result = a + b;

        // 特殊的,byte、short、char之间不互相转换，一旦发生运算，一律自动转换为int进行运算
        // byte + byte = int
        byte b1 = 100;
        byte b2 = 20;
        int result2 = b1 + b2;

        // 最特殊的,一旦表达式中有字符串参与"+"的拼接字符串运算,那么表达式的结果一定是一个字符串
        String result3 = a + b + "abc";
    }
}
